#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//qsort函数可以排序任意类型的数据
//void qsort(	void* base, //指向待排序数组的第一个元素 --> void* 方便接收任意类型的地址
//			size_t num, //base指向数组的元素个数
//			size_t size,//每个元素所占字节数
//			int (*cmp)(const void* p1, const void* p2)); //函数指针，指向的函数可以比较数组中的两个元素
//			//p1指向的元素比p2指向的元素小，返回<0的数字
//			//p1指向的元素比p2指向的元素大，返回>0的数字
//          //p1和p2指向的元素相等，返回0


//1、测试qsort来排序整型数组
//int cmp_int(const void* p1, const void* p2) //比较p1、p2指向的两个整型值
//{
//	int a = *(int*)p1; //void* 无法直接解引用，需要先转换成int*
//	int b = *(int*)p2;
//	return a - b;
//
//	//return *(int*)p1 - *(int*)p2;
//}
//
//void print_arr_int(int arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test1()
//{
//	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//    qsort(arr, sz, sizeof(arr[0]), cmp_int); //默认是升序的，降序的话，将cmp_int函数的返回值改为-a + b
//    print_arr_int(arr, sz);
//}

//2、测试qsort来排序浮点型数组
//int cmp_float(const void* p1, const void* p2) //比较p1、p2指向的两个浮点型值
//{
//	//float a = *(float*)p1;
//	//float b = *(float*)p2;
//	//return a - b;//最好不要用a-b，可能会有精度问题
//
//	if (*(float*)p1 < *(float*)p2)
//        return -1;
//    else if (*(float*)p1 > *(float*)p2)
//        return 1;
//    else
//		return 0;
//}
//
//void print_arr_float(float arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%.2f ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test2()
//{
//    float arr2[] = { 10.1, 9.2, 8.3, 7.4, 6.5, 5.6, 4.7, 3.8, 2.9, 1.0 };
//    int sz = sizeof(arr2) / sizeof(arr2[0]);
//	qsort(arr2, sz, sizeof(arr2[0]), cmp_float);
//    print_arr_float(arr2, sz);
//}

//3、测试qsort来排序结构体数组
//struct Stu
//{
//    char name[20];
//    int age;
//};
//
//int cmp_struct_by_age(const void* p1, const void* p2)
//{
//	return (*(struct Stu*)p1).age - (*(struct Stu*)p2).age;
//}

//两个字符串比较大小：strcmp
//strcmp(str1, str2)
//返回值：
//小于0，str1 < str2
//等于0，str1 == str2
//大于0，str1 > str2
//int cmp_struct_by_name(const void* p1, const void* p2)
//{
//	return strcmp((*(struct Stu*)p1).name, (*(struct Stu*)p2).name);
//}
//
//void print_arr_struct(struct Stu arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s %d\n", arr[i].name, arr[i].age);
//	}
//}
//
//void test3()
//{
//	struct Stu arr3[] = { {"Tom",18}, {"Jack", 20}, {"Bonb",34} };
//	int sz = sizeof(arr3) / sizeof(arr3[0]);
//	//qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_by_age);
// //   print_arr_struct(arr3, sz);
//	qsort(arr3, sz, sizeof(arr3[0]), cmp_struct_by_name);
//    print_arr_struct(arr3, sz);
//}

//int main()
//{
//	//test1();
//    //test2();
//    //test3();
//
//	struct Stu s = { "ZhangSan", 24 };
//    printf("%s\n", s.name);
//    printf("%d\n", s.age);
//	//结构体变量.成员名
//
//	struct Stu* ps = &s;
//	//不解引用
//	//-> ：结构体成员访问操作符
//	//结构体指针->成员名
//    printf("%s\n", ps->name);//相当于(*ps).name
//    printf("%d\n", ps->age);//相当于(*ps).age
//
//	return 0;
//}